/**
 * 本地存储服务
 * 负责笔记和文件夹数据的持久化
 */

import { formatDate, formatFullDateTime } from '../utils/dateUtils'
import type { Folder, Note, AppData } from '../types'

// 重新导出类型以保持向后兼容
export type { Folder, Note, AppData }

const STORAGE_KEY = 'linkbook-data'

/**
 * 保存数据到本地存储
 * @param data 应用数据
 */
export const saveData = (data: AppData): void => {
  try {
    const jsonData = JSON.stringify(data)
    localStorage.setItem(STORAGE_KEY, jsonData)
    console.log('数据已保存到本地存储')
  } catch (error) {
    console.error('保存数据失败:', error)
  }
}

/**
 * 从本地存储加载数据
 * @returns 应用数据或默认数据
 */
export const loadData = (): AppData => {
  try {
    const jsonData = localStorage.getItem(STORAGE_KEY)
    if (jsonData) {
      const data = JSON.parse(jsonData) as AppData
      console.log('从本地存储加载数据成功')
      return data
    }
  } catch (error) {
    console.error('加载数据失败:', error)
  }

  // 返回默认数据
  return getDefaultData()
}

/**
 * 获取默认数据
 * @returns 默认应用数据
 */
export const getDefaultData = (): AppData => {
  return {
    folders: [
      { id: 1, name: '全部笔记', count: 1, isDefault: true, parentId: null },
      { id: 2, name: '未分类笔记', count: 0, isDefault: true, parentId: null }
    ],
    notes: [
      {
        id: 1,
        title: '未命名文档',
        content: '请编辑你的内容吧！',
        folderId: 1,
        createdAt: formatDate(),
        updatedAt: formatFullDateTime()
      }
    ],
    currentFolder: '全部笔记',
    currentNoteId: 1
  }
}

/**
 * 清除本地存储数据
 */
export const clearData = (): void => {
  try {
    localStorage.removeItem(STORAGE_KEY)
    console.log('本地存储数据已清除')
  } catch (error) {
    console.error('清除数据失败:', error)
  }
}

/**
 * 导出数据为JSON文件
 * @param data 应用数据
 */
export const exportData = (data: AppData): void => {
  try {
    const jsonData = JSON.stringify(data, null, 2)
    const blob = new Blob([jsonData], { type: 'application/json' })
    const url = URL.createObjectURL(blob)

    const link = document.createElement('a')
    link.href = url
    link.download = `linkbook-backup-${new Date().toISOString().split('T')[0]}.json`
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)

    URL.revokeObjectURL(url)
    console.log('数据导出成功')
  } catch (error) {
    console.error('导出数据失败:', error)
  }
}

/**
 * 从JSON文件导入数据
 * @param file JSON文件
 * @returns Promise<AppData | null>
 */
export const importData = (file: File): Promise<AppData | null> => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()

    reader.onload = (event) => {
      try {
        const jsonData = event.target?.result as string
        const data = JSON.parse(jsonData) as AppData

        // 简单验证数据格式
        if (
          data.folders &&
          data.notes &&
          Array.isArray(data.folders) &&
          Array.isArray(data.notes)
        ) {
          console.log('数据导入成功')
          resolve(data)
        } else {
          throw new Error('数据格式不正确')
        }
      } catch (error) {
        console.error('解析导入数据失败:', error)
        reject(error)
      }
    }

    reader.onerror = () => {
      console.error('读取文件失败')
      reject(new Error('读取文件失败'))
    }

    reader.readAsText(file)
  })
}
